// 一、引入验证码第三方模块
const svgCaptcha = require('svg-captcha');
// 1、引入session
const cookieSession = require('cookie-session');
const path = require('path');
const fs = require('fs');
const timeStamp = require('time-stamp');
const express = require('express');
let app = express();
app.listen(3000);


// console.log(timeStamp("YYYY年MM月DD日 HH:mm:ss"));

// （1）下载ejs
// （2）设置模板引擎为ejs
app.set("view engine", "ejs")


//2、注册session中间件
app.use(cookieSession({
    keys: ["asa", "asfa"],
    maxAge: 60 * 1000,
}))


// ① 注册提交：post中间件
app.use(express.urlencoded({ extended: true }))
app.use(express.json())



// 渲染页面
app.get("/register", (req, res) => {
    // （3）使用ejs渲染页面
    res.render("register")
})


// 提交注册
app.post("/register", (req, res, next) => {
    // ② 接收数据，并检查有没有提交正确的数据
    let { username, password, password2, yzm } = req.body

    if (!username || !password || !password2 || !yzm) {
        next("请传递必要的参数")//传了参数的next，会走到逻辑错误处理
        return
    }

    if (password != password2) {
        next("两次输入的密码不正确")
        return
    }

    // console.log(yzm);
    // console.log(req.session.yzm);
    // console.log(yzm.toUpperCase());
    // console.log(req.session.yzm.toUpperCase());
    // 服务器有没有生成验证码（验证码过期了没有）
    if (!req.session.yzm) {
        next("验证码已过期")
        return
    }

    if (yzm.toUpperCase() != req.session.yzm.toUpperCase()) {
        next("验证码不正确")
        return
    }

    // ③查询数据库，判断账号是否可以注册
    let filepath = path.join(__dirname, "./data/persons.json")
    let result = fs.readFileSync(filepath, "utf-8")
    let persons = JSON.parse(result)
    // console.log(persons);


    let index = persons.findIndex(item => {
        return username == item.username
    })

    if (index != -1) {
        next("此用户名已被占用")
        return
    }

    // ④ 执行注册
    let time = timeStamp("YYYY年MM月DD日 HH:mm:ss")
    persons.push({ username, password, time })

    fs.writeFileSync(filepath, JSON.stringify(persons))

    // res.send({
    //     code: 200,
    //     msg: "注册成功"
    // })

    res.render("message", { code: 200, msg: "注册成功" })
})



// 二、生成验证码路由
app.get("/getsvg", (req, res) => {

    // 三、创建验证码
    let svg = svgCaptcha.create({
        color: true,
        background: "#EEE",
        noise: 6,
        size: 5,
        ignoreChars: "0oOIl1"
    })


    // 3、使用session把文字存储下来，并把sessionid存储在cookie上，并把cookie响应到浏览器
    // res.send(svg)
    // 四、服务器存储验证码
    req.session.yzm = svg.text


    // 五、把验证码图片渲染出去
    res.type("svg")// 设置验证码图片类型
    res.send(svg.data)
})







// 错误处理
app.use((req, res, next) => {
    res.render("message", { code:404,msg:"此路不通"})
    // next("此路不通")
})


app.use((err, req, res, next) => {

    // res.send({
    //     status: 500,
    //     err
    // })

    res.render("message", { msg: err, code: 500 })
})